package demo16

// 解析器设计模式

type Node interface{
	Interpret() int
}

type ValNode struct{
	val int
}

func (v *ValNode)Interpret() int {
	return v.val
}

type AddNode struct{
	right,left Node
}

func (a *AddNode)Interpret() int{
	return a.right.Interpret() + a.left.Interpret()
}

type MinNode struct{
	right,left Node
}

func (m *MinNode)Interpret() int{
	return a.right.Interpret() - a.left.Interpret()
}

type Parser struct{
	exp []string
	index int
	prev  Node
}

func (p *Parser)NewParser(context string){
	p.exp = strings.Split(context)

	for{
		if p.index >= len(p.exp){
			return
		}
		switch exp[index] {
		case "+":
			p.prev = p.newAddNode()
		case "-":
			p.prev = p.newMinNode()
		default:
			p.prev = p.newValNode()
		}
	}
}

func (p *Parser)newAddNode() Node{
	p.index++
	return &AddNode{
		left:p.prev,
		right:p.newValNode(),
	}
}

func (p *Parser)newMinNode() Node{
	p.index++
	return &MinNode{
		left:p.prev,
		right:p.newValNode(),
	}
}

func (p *Parser)newValNode() Node{
	val, _:= strconv.Atoi(p.exp[p.index])
	p.index++
	return &ValNode{
		val:val,
	}
}

func (p *Parser)GetResult() Node{
	return p.prev
}